/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: erfea (Edvard)
 *    E-Mail: erfea.tux@gmail.com
 */

#include "tspl_se_std.h"
#include "def.h"
#include "tspl_se_std_engine.h"
#include <QMessageBox>
//#include <QTranslator>

Tspl_se_std::~Tspl_se_std(){
	QHashIterator<QString,Tspl_se_std_engine*> i(this->mEngines);
	while (i.hasNext()){
		delete i.value();
	}
}

bool Tspl_se_std::qinit(const QStringList &cfgstr){
	mWaitQuery = false;
}

void Tspl_se_std::slotAddQuery(const QString &name, const QList<QVariant> &params, Tspl_se_std_engine *sender){
	Query q;
	q.name = name;
	q.params = params;
	q.sender = sender;
	mQueryes.append(q);

	this->nextQuery();
}

void Tspl_se_std::nextQuery(){
	if (!this->mWaitQuery && !this->mQueryes.isEmpty())
		{emit this->sigQexec(PLUGIN_NAME,this->mQueryes.first().name,this->mQueryes.first().params);this->mWaitQuery=true;}
}

void Tspl_se_std::slotDb(const QString &plName, int id, QSqlQuery *ret){
	if (plName == PLUGIN_NAME){//ответ мне
		if (mQueryes.first().sender == 0){//запрос свой
			//обрабатываем тут
			if (mQueryes.first().name == "base_get_scripts_rw" || mQueryes.first().name == "base_get_scripts_ro"){
				while (ret->next()){
					Tspl_se_std_engine *eng = new Tspl_se_std_engine(ret->value(1).toString(),
																	 ret->value(2).toString(),
																	 mRootWidgets.value(ret->value(0).toString()),this);
					QObject::connect(eng,SIGNAL(sigAddQuery(QString,QList<QVariant>,Tspl_se_std_engine*)),
									 this,SLOT(slotAddQuery(QString,QList<QVariant>,Tspl_se_std_engine*)));
					this->mEngines.insert(ret->value(0).toString(),eng);
				}
			}
			//чистим за собой и пробуем отослать следующий
			emit this->sigClear(id);
			this->mQueryes.removeFirst();
			this->mWaitQuery=false;
			this->nextQuery();
		}else{//запрос от кого-то из скриптов
			//если селект построчно передаем скрипту данные
			if (ret->isSelect()){
				while (ret->next()){
					QSqlRecord rec = ret->record();
					QList<QVariant> row;
					for (int i =0;rec.count()>i;i++){
						row.append(ret->value(i));
					}
					mQueryes.first().sender->sendRow(row);
				}
			}
			else//если не селект передаем число измененных строк
				mQueryes.first().sender->sendNumRowsAffected(ret->numRowsAffected());
			//чистим за собой и пробуем отослать следующий
			emit this->sigClear(id);
			this->mQueryes.removeFirst();
			this->mWaitQuery=false;
			this->nextQuery();
		}
	}
}

void Tspl_se_std::slotDbErr(const QString &plName, const QString &errtext){
	if (plName == PLUGIN_NAME){//ответ мне
		if (mQueryes.first().sender == 0){//запрос свой
			//сообщаем об ошибке
			emit this->sigPutLog(PLUGIN_NAME,2,errtext);
			//чистим за собой и пробуем отослать следующий
			this->mQueryes.removeFirst();
			this->mWaitQuery=false;
			this->nextQuery();
		}else{//запрос от кого-то из скриптов
			//сообщаем об ошибке и передаем печальную инфу скрипту
			emit this->sigPutLog(PLUGIN_NAME,2,errtext);

			//чистим за собой и пробуем отослать следующий
			this->mQueryes.removeFirst();
			this->mWaitQuery=false;
			this->nextQuery();
		}
	}
}

void Tspl_se_std::slotLoad(const QString &pl_name, bool cann_write,QObject *root_widget){
	QList<QVariant> params;
	params.append(pl_name);
	//сохраняем указатель на root_widget
	this->mRootWidgets[pl_name]=root_widget;
	//просим список скриптов
	if (cann_write)
		this->slotAddQuery("base_get_scripts_rw",params);
	else
		this->slotAddQuery("base_get_scripts_ro",params);
	//ответ должен вернуться в виде "Имяплагина,имяскрипта,кодскрипта"
}

Q_EXPORT_PLUGIN2(TsIfaceSePlugin,Tspl_se_std)
